﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Web;

//namespace MulticastService
//{


//    public class Peer
//    {
//        public List<int> location;
//        public string clustering_key;
//    }

//    public class Cluster
//    {
//        public Peer peer;
//        public Cluster super;
//        public int id;
//        public List<Cluster> sub;
//        public DataStreamCollection data;
//        public Structure structure;

//        public void AttachPeer(Peer p)
//        {
//            peer = p;
//        }

//        public Cluster LocateSub(int sub_id)
//        {
//            foreach (Cluster sub_cluster in sub)
//            {
//                if (sub_cluster.id == sub_id)
//                    return sub_cluster;
//            }
//            return null;
//        }

//        public void AddSub(Cluster sub_cluster)
//        {
//            sub.Add(sub_cluster);
//            sub_cluster.super = this;
//        }

//        public void AddSub(int id)
//        {
//            Cluster sub_cluster = new Cluster();
//            sub_cluster.id = id;
//            AddSub(sub_cluster);
//        }

//        public void RemoveSub(Cluster sub_cluster)
//        {
//            sub.Remove(sub_cluster);
//            sub_cluster = null;
//        }

//        public void RemoveSub(int id)
//        {
//            Cluster temp = LocateSub(id);
//            if(temp!=null)
//                RemoveSub(temp);
//        }

//        public Cluster FindRoot()
//        {
//            Cluster root=this;
//            while (root.super != null)
//                root = root.super;
//            return root;
//        }
//    }

//    public class RootCluster : Cluster
//    {
//        List<Cluster> peer_cluster;

//        public void AddPeer(Peer peer)
//        {
//            Cluster c = this;
//            Cluster temp;
//            foreach (int location in peer.location)
//            {
//                temp = c.LocateSub(location);
//                if (temp == null)
//                {
//                    c.AddSub(location);
//                    c = c.LocateSub(location);
//                }
//                else
//                    c = temp;
//            }
//            c.AttachPeer(peer);
//            peer_cluster.Add(c);
//        }

//        public void RemovePeer(Peer p)
//        {
//            Cluster cluster;
//            IEnumerable<Cluster>iqc = from c in peer_cluster
//                              where c.peer == p
//                              select c;
//            if (iqc.Count() > 0)
//                cluster = iqc.First();
//            else
//                return;
//            RemoveCluster(cluster);
//        }

//        public void RemoveCluster(Cluster c)
//        {
//            if (c.FindRoot() != this)
//                return;
//            else
//            {
//                Cluster cluster = c;
//                Cluster sup = cluster.super;
//                while (cluster.sub.Count() == 0 && sup!=null)
//                {
//                    sup.RemoveSub(cluster);
//                    cluster = sup;
//                    sup = cluster.super;
//                }
//            }
//        }

//        public void AddPeer(string clustering_key, List<int> location)
//        {
//            Peer p = new Peer();
//            p.location = new List<int>();
//            p.clustering_key = clustering_key;
//            foreach (int i in location)
//                p.location.Add(i);
//            AddPeer(p);
//        }

//        public void RemovePeer(string clustering_key)
//        {
//            IEnumerable<Cluster> iec = from c in peer_cluster
//                                       where c.peer.clustering_key == clustering_key
//                                       select c;
//            if (iec.Count() > 0)
//                RemoveCluster(iec.First());
//        }

//        public void GenerateStructure()
//        {
//            structure = new Structure();
//        }

//        public Cluster  FindSourcePeerCluster(int upload_serial)
//        {
//            Cluster temp=this;
//            int serial=upload_serial;
//            while(temp.peer==null)
//            {
//                temp=temp.substitute_parameter[serial].cluster;
//                serial=temp.substitute_parameter[serial].upload_serial;
//            }
//            return temp;
//        }
//    }
//}
